package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Aspect
@Slf4j
//@Component
public class MyAspect1 {
    @Before("execution(* com.itheima.service.impl.*.*(..))")
    public void before(JoinPoint jp){
        String className= jp.getTarget().getClass().getName();
        String methodName=jp.getSignature().getName();
        log.info("{},{}方法被执行前执行了:before",methodName,className);


    }

    @Around("execution(* com.itheima.service.impl.*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //1）在方法执行前，获取系统时间（目标方法调用前的时间）
        long start=System.currentTimeMillis();
//       /2）执行目标方法（删除员工、新增员工..
        Object result =pjp.proceed();
        //3）获取系统时间，并将当前系统时间-前面开始时间，得到方法执行耗时时间
        long end=System.currentTimeMillis();
        String className =pjp.getTarget().getClass().getName();
        String methodName= pjp.getSignature().getName();
        log.info("{},{}耗时时间:{}ms",methodName,className,end-start);

        //4）返回一个object对象
        return result;

    }


    @After("execution(* com.itheima.service.impl.*.*(..))")
    public void after(JoinPoint jp){
        String className = jp.getTarget().getClass().getName();
        String methodName = jp.getSignature().getName();
        log.info("{},{} after执行了",className,methodName);


    }
    //返回后通知（程序在正常执行的情况下，会执行的后置通知）
    @AfterReturning("execution(* com.itheima.service.impl.*.*(..))")
    public void afterReturning(JoinPoint joinPoint){
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        log.info("{},{} AfterReturning执行了",className,methodName);


    }
    //异常通知（程序在出现异常的情况下，执行的后置通知）
        @AfterThrowing("execution(* com.itheima.service.impl.*.*(..))")
    public void afterThorwing(JoinPoint joinPoint){
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            log.info("{},{} afterThorwing执行了",className,methodName);


    }




}
